#ifndef _PLANE_H_
#define _PLANE_H_

#include "Maths.h"

#include "Vector.h"
#include "Ray.h"

namespace Math{
/**
 * Un plan dans l'espace
 *
 * Un plan est défini par un point dans l'espace et une normale
 */       
class MATH_API Plane
{
 public:
    /**
     * constructeur par défaut
     */
    Plane() {};

    /**
     * construit à partir d'un sommet et d'une normale
     * @param pos la position
     * @param norm la normale
     */
    Plane(Vector pos,Vector norm);

	/**
	* Destructeur
	*/
	~Plane() {}

    /**
     * Retourne la normale du plan
     * @return la normale du plan
     */
    INLINED Vector& getNormal();
    
    /**
     * Retourne la position du plan
     * @return la position du plan
     */
    INLINED Vector& getPosition();

    /**
     * methode d'intersection avec un rayon
     * @return Vrai si intersection
     */
    bool intersects(Ray& ray, float& distance, Math::Vector &v);

    /**
     * Retourne la normale et l'UV du point d'intersection
     * si les parametres sont non-nuls
     * @param t la distance
     * @param ray le rayon a tester
     * @param normal normale à remplir
     * @param uv vecteur uv à remplir
     */
    void getIntersectionParams(Math::Ray &ray,const float t, Vector *normal, Vector *uv);

 private:
    Vector m_Position;    	///< la position du plan
    Vector m_Normal; 		///< la normale du plan
}; 

}

#endif
 
